Initialize air temperature
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(IniList), | intent(in) | :: | ini | |||
type(grid_integer), | intent(in) | :: | mask |
defines interpolation extent |
||
integer(kind=short), | intent(in) | :: | dtMeteo |
deltat of meteo data reading |
||
type(DateTime), | intent(in) | :: | tstart |
initial time |
||
logical, | intent(in) | :: | dem_loaded |
true if dem has been loaded |
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
character(len=1000), | public | :: | filename | ||||
type(DateTime), | public | :: | lapseTime | ||||
type(grid_real), | public | :: | meteoTemp |
SUBROUTINE AirTemperatureDailyMinInit & ! ( ini, mask, dtMeteo, tstart, dem_loaded ) IMPLICIT NONE TYPE (IniList), INTENT(IN) :: ini TYPE (grid_integer), INTENT(IN) :: mask !!defines interpolation extent INTEGER (KIND = short), INTENT(IN) :: dtMeteo !! deltat of meteo data reading TYPE (DateTime), INTENT(IN) :: tstart !!initial time LOGICAL , INTENT (IN) :: dem_loaded !! true if dem has been loaded !local declarations CHARACTER (LEN = 1000) :: filename TYPE (DateTime) :: lapseTime TYPE (grid_real) :: meteoTemp !-------------------------end of declarations---------------------------------- !set initial time timeNew = tstart !initialize grid CALL NewGrid (temperatureAirDailyMin, mask, 0.) CALL NewGrid (grid_devst, mask, 0.) !set deltat dtTemperatureDailyMin = day !check dt is multiple of dtMeteo IF (.NOT.(MOD(dtTemperatureDailyMin,dtMeteo) == 0)) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'dt is not multiple of dtMeteo') END IF !set valid threshold IF (KeyIsPresent ('valid-threshold', ini, & section = 'temperature-daily-min') ) THEN valid_prcn = IniReadReal ('valid-threshold', ini, & section = 'temperature-daily-min') ELSE ! set to default = 1.0 CALL Catch ('info', 'AirTemperatureDailyMin', & 'valid-threshold not defined, set to 1') valid_prcn = 1. END IF !set cell-size cellsizeInterpolation = mask % cellsize !interpolation-assignment method IF (KeyIsPresent('interpolation-assignment', ini, & section = 'temperature-daily-min') ) THEN interpolationMethod_assignment = IniReadInt ('interpolation-assignment', ini, & section = 'temperature-daily-min') ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'interpolation-assignment missing in meteo configuration file') END IF !set interpolation method IF (interpolationMethod_assignment == 1) THEN interpolationMethod = IniReadInt ('interpolation', ini, & section = 'temperature-daily-min') CALL SetSpecificProperties (interpolationMethod, ini, mask) ELSE !read map interpolationMethod = -1 CALL GridByIni (ini, interpolationMethod_map, 'temperature-daily-min', & "interpolation") !scan for interpolation methods included interpolationMethod_vector = 0 DO i = 1, interpolationMethod_map % idim DO j = 1, interpolationMethod_map % jdim IF (interpolationMethod_map % mat(i,j) /= & interpolationMethod_map % nodata) THEN interpolationMethod_vector & (interpolationMethod_map % mat (i,j)) = & interpolationMethod_map % mat (i,j) END IF END DO END DO DO i = 1, 3 CALL SetSpecificProperties (interpolationMethod_vector (i), ini, mask) END DO END IF !scale factor and offset IF (KeyIsPresent('offset', ini, section = 'temperature-daily-min')) THEN offset_value = IniReadReal ('offset', ini, section = 'temperature-daily-min') ELSE offset_value = MISSING_DEF_REAL END IF IF (KeyIsPresent('scale-factor', ini, section = 'temperature-daily-min')) THEN scale_factor = IniReadReal ('scale-factor', ini, section = 'temperature-daily-min') ELSE scale_factor = MISSING_DEF_REAL END IF !set power_idw IF (KeyIsPresent('idw-power', ini, section = 'temperature-daily-min')) THEN idw_power = IniReadReal ('idw-power', ini, section = 'temperature-daily-min') ELSE !set default value idw_power = 2. END IF !file filename = IniReadString ('file', ini, section = 'temperature-daily-min') IF (interpolationMethod_assignment == 1 .AND. & interpolationMethod == 0) THEN !data are stored in net-cdf file !store net-cdf filename fileGrid = filename IF ( KeyIsPresent ('variable', ini, section = 'temperature-daily-min') ) THEN temperatureAirDailyMin % var_name = IniReadString ('variable', & ini, section = 'temperature-daily-min') !read grid and store as temporary file CALL NewGrid (layer = meteoTemp, fileName = TRIM(fileGrid), & fileFormat = NET_CDF, & variable = TRIM(temperatureAirDailyMin % var_name) ) ELSE IF (KeyIsPresent ('standard_name', ini, & section = 'temperature-daily-min') ) THEN temperatureAirDailyMin % standard_name = IniReadString ('standard_name', & ini, section = 'temperature-daily-min') ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'standard_name or variable missing in section temeprature' ) END IF !set cellsize to zero. Optimal cellsize is automatically computed cellsizeInterpolation = 0. ELSE !open file containing local measurements fileunit = GetUnit () OPEN(fileunit,file = filename(1:LEN_TRIM(filename)),status='old') END IF !use elevation to drift interpolation IF ( KeyIsPresent ('elevation-drift', ini, section = 'temperature-daily-min') ) THEN elevationDrift = IniReadInt ('elevation-drift', ini, section = 'temperature-daily-min') ELSE elevationDrift = 0 !default, suppress drift END IF IF (elevationDrift == 1) THEN IF (interpolationMethod == 0 ) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'elevation drift cannot be applied when interpolation = 0 ') END IF !check if have been loaded by domain properties IF ( .NOT. dem_loaded) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'dem for elevation drift was not loaded ') END IF !need lapse-rate computation? IF (KeyIsPresent ('lapse-rate-computation', ini, & section = 'temperature-daily-min') ) THEN lapse_rate_computation = IniReadInt ('lapse-rate-computation', ini, & section = 'temperature-daily-min') ELSE !lapse-rate-computation is missing CALL Catch ('error', 'AirTemperatureDailyMin', & 'lapse-rate-computation missing in meteo configuration file') END IF IF ( lapse_rate_computation == 1 .AND. interpolationMethod == 0 ) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'lapse_rate_computation option requires interpolation different from 0') END IF IF (KeyIsPresent ('r2min', ini, & section = 'temperature-daily-min') ) THEN r2min = IniReadInt ('r2min', ini, & section = 'temperature-daily-min') ELSE !r2min is missing IF (lapse_rate_computation == 1) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'r2min missing in meteo configuration file') END IF END IF !set lapse rate assignment IF (KeyIsPresent ('lapse-rate-assignment', ini, & section = 'temperature-daily-min') ) THEN lapse_rate_assignment = IniReadInt ('lapse-rate-assignment', ini, & section = 'temperature-daily-min') ELSE !lapse-rate-assignment missing IF (lapse_rate_computation == 0) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'lapse-rate-assignment missing in meteo configuration file') ELSE lapse_rate_assignment = 1 END IF END IF !lapse rate map IF (lapse_rate_assignment == 2) THEN IF ( SubSectionIsPresent (subsection = 'lapse-rate-map', & section = 'temperature-daily-min', iniDb = ini) ) THEN !check all keywords are defined IF (IniReadString ('format', ini, 'temperature-daily-min',& 'lapse-rate-map') == 'net-cdf') THEN IF (KeyIsPresent ('time',ini, 'temperature-daily-min', & 'lapse-rate-map')) THEN timeString = IniReadString ('time', ini, & 'temperature-daily-min', 'lapse-rate-map') lapseTime = timeString IF (lapseTime > tstart) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'lapse-rate-map time greater than starting time' ) END IF ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'time keyword is missing in lapse-rate-map subsection' ) END IF END IF CALL GridByIni (ini, lapse_map, 'temperature-daily-min', "lapse-rate-map") !check coordinate reference system and spatial resolution IF (.NOT. CRSisEqual (mask = mask, grid = lapse_map, & checkCells= .TRUE.)) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'wrong lapse-rate-map spatial reference system ') END IF ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'lapse-rate-map missing in meteo configuration file') END IF ELSE !build lapse map from scalar value IF ( KeyIsPresent ('lapse-rate-scalar', ini, & section = 'temperature-daily-min') ) THEN lapse = IniReadReal ('lapse-rate-scalar', ini, & section = 'temperature-daily-min') CALL NewGrid (lapse_map, mask) lapse_map = lapse ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'lapse-rate-scalar missing in meteo configuration file') END IF END IF END IF !grid exporting settings IF (KeyIsPresent ('export', ini, section = 'temperature-daily-min') ) THEN export = IniReadInt ('export', ini, section = 'temperature-daily-min') ELSE export = 0 END IF IF (export == 1) THEN !set export path name IF (KeyIsPresent ('export-path', ini, section = 'temperature-daily-min') ) THEN export_path = IniReadString ('export-path', ini, section = 'temperature-daily-min') !check if path ends with / or \ IF ( export_path (LEN_TRIM (export_path):LEN_TRIM (export_path)) /= '\' .AND. & export_path (LEN_TRIM (export_path):LEN_TRIM (export_path)) /= '/' ) THEN export_path (LEN_TRIM (export_path)+1:LEN_TRIM (export_path)+1) = '\' END IF IF (INDEX (export_path,'.') == 1) THEN !detected relative path, remove '.' export_path = export_path (2:LEN_TRIM(export_path)) !build absolute path export_path = TRIM(CurrentDir() ) // TRIM(export_path) END IF !check OS convention IF (GetOS () == WIN32) THEN export_path = ReplaceChar (export_path,'/','\') ELSE export_path = ReplaceChar (export_path,'\','/') END IF !check folder exists IF ( .NOT. DirExists (TRIM (export_path) ) ) THEN CALL Catch ('info', 'AirTemperatureDailyMin', & 'creating directory: ', argument = TRIM(export_path)) CALL DirNew (export_path) END IF ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'missing export-path') END IF !starting time IF (KeyIsPresent ('export-start', ini, section = 'temperature-daily-min') ) THEN timeString = IniReadString ('export-start', ini, 'temperature-daily-min') export_start = timeString ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'missing export-start') END IF !initialize timeNewExport timeNewExport = export_start !ending time IF (KeyIsPresent ('export-stop', ini, section = 'temperature-daily-min') ) THEN timeString = IniReadString ('export-stop', ini, 'temperature-daily-min') export_stop = timeString ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'missing export-start') END IF !export dt IF (KeyIsPresent ('export-dt', ini, section = 'temperature-daily-min') ) THEN export_dt = IniReadInt ('export-dt', ini, section = 'temperature-daily-min') ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'missing export-dt') END IF !coordinate reference system IF (KeyIsPresent ('export-epsg', ini, section = 'temperature-daily-min') ) THEN export_epsg = IniReadInt ('export-epsg', ini, section = 'temperature-daily-min') exportGridMapping = DecodeEPSG (export_epsg) IF (exportGridMapping == temperatureAirDailyMin % grid_mapping) THEN needConversion = .FALSE. !initialize grid for exporting with CRS as meteo variable CALL NewGrid (exportedGrid, temperatureAirDailyMin) CALL NewGrid (exportedGridVar, temperatureAirDailyMin) ELSE needConversion = .TRUE. !initialize grid for converting with required CRS exportedGrid % grid_mapping = DecodeEPSG (export_epsg) exportedGridVar % grid_mapping = DecodeEPSG (export_epsg) END IF ELSE CALL Catch ('info', 'AirTemperatureDailyMin', & 'export-epsg not defined, use default') needConversion = .FALSE. !initialize grid for exporting with CRS CALL NewGrid (exportedGrid, temperatureAirDailyMin) CALL NewGrid (exportedGridVar, temperatureAirDailyMin) END IF !export file format IF (KeyIsPresent ('export-format', ini, section = 'temperature-daily-min') ) THEN export_format = IniReadInt ('export-format', ini, section = 'temperature-daily-min') ELSE CALL Catch ('error', 'AirTemperatureDailyMin', & 'missing export-format') END IF IF (export_format == 3) THEN !grid map CALL SetLongName ( 'air_temperature', exportedGrid) CALL SetStandardName ( 'air_temperature', exportedGrid) CALL SetUnits ('degree_Celsius', exportedGrid) !this unit is for exporting grid, it is converted internally to m/s !if file exists, remove it export_file = TRIM(export_path) // 'temperature_daily_min.nc' IF ( FileExists (export_file) ) THEN CALL FileDelete (export_file) END IF !variance of kriging CALL SetLongName ( 'air_temperature_variance', exportedGridVar) CALL SetStandardName ( 'air_temperature_variance', exportedGridVar) CALL SetUnits ('degree_Celsius', exportedGridVar) !this unit is for exporting grid !if file exists, remove it export_file_var = TRIM(export_path) // 'temperature_daily_min_variance.nc' IF ( FileExists (export_file_var) ) THEN CALL FileDelete (export_file_var) END IF END IF END IF !complete initialization IF (interpolationMethod == 0) THEN !Get the dt of imported field. Assume dt is regular dtGrid = GetDtGrid (filename = fileGrid, checkRegular = .TRUE.) !check dt is multiple of dtGrid IF (.NOT.(MOD(dtTemperatureDailyMin,dtGrid) == 0)) THEN CALL Catch ('error', 'AirTemperatureDailyMin', & 'dt temperature daily min is not multiple of dt of input grid') END IF ELSE !populate metadata CALL ReadMetadata (fileunit, thermometersDailyMin) !check spatial reference system IF ( .NOT. thermometersDailyMin % mapping == mask % grid_mapping) THEN CALL Catch ('info', 'AirTemperatureDailyMin', & 'converting coordinate of stations') !convert stations' coordinate point1 % system = thermometersDailyMin % mapping point2 % system = mask % grid_mapping thermometersDailyMin % mapping = mask % grid_mapping DO i = 1, thermometersDailyMin % countObs point1 % easting = thermometersDailyMin % obs (i) % xyz % easting point1 % northing = thermometersDailyMin % obs (i) % xyz % northing point1 % elevation = thermometersDailyMin % obs (i) % z CALL Convert (point1, point2) thermometersDailyMin % obs (i) % xyz % easting = point2 % easting thermometersDailyMin % obs (i) % xyz % northing = point2 % northing END DO END IF !set supplementary stations network for elevation drift IF (elevationDrift == 1) THEN stationsRefElev = thermometersDailyMin DO i = 1, thermometersDailyMin % countObs stationsRefElev % obs (i) % xyz % elevation = refElevation END DO END IF !allocate vectors if lapse rate has to be computed from data IF ( lapse_rate_computation == 1) THEN ALLOCATE (vectorT (thermometersDailyMin % countObs) ) ALLOCATE (vectorZ (thermometersDailyMin % countObs)) END IF END IF RETURN END SUBROUTINE AirTemperatureDailyMinInit